﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Super_Pong.Classes;

namespace Super_Pong.BaseClasses
{
    public class Bullet : Entity
    {
        #region Atributos
        int damage;
        Animation hitAnimation;
        Vector2 origin; // bullet's center point
        bool alive;
        gunType type;
        float rotation;
        GameWindow gw;
        #endregion

        #region Construtores
        /// <summary>
        /// Construtor completo da bala
        /// </summary>
        /// <param name="dmg">Dano causado pela bala</param>
        /// <param name="ani">Animação da bala</param>
        /// <param name="hitAni">Animação do impacto da bala</param>
        /// <param name="gt">Tipo da arma (PHOTON, LASER OU BLOCK)</param>
        /// <param name="pos">Posição</param>
        /// <param name="dir">Direção</param>
        /// <param name="gmWindow">Tela do jogo</param>
        /// <param name="rotation">rotacao da bala</param>
        public Bullet(int dmg, Animation ani, Animation hitAni, gunType gt, Vector2 pos, Vector2 dir,GameWindow gmWindow, float rotation, Vector2 origin)
        {
            damage = dmg;
            setAnimation(ani);
            alive = true;
            type = gt;
            setPosition(pos);
            setDirection(dir);
            setHitAnimation(hitAni);
            gw = gmWindow;
            this.rotation = rotation;
            this.origin = origin;
        }

        #endregion

        #region Métodos     

        #region Colliding Methods

        /// <summary>
        /// Ação após a colisão da bala com um obstaculo usando uma entity como parametro
        /// </summary>
        /// <param name="e">Entidade</param>
        public override void collide(Entity e)
        {
            if (this.isColliding(e))
            {
               kill();
            }
        }

        /// <summary>
        /// Ação após a colisão da bala com um obstaculo usando uma boundingbox como parametro
        /// </summary>
        /// <param name="bb">BoundingBox</param>
         public void collide(BoundingBox bb)
        {

            if (this.isColliding(bb))
            {
               kill();
            }
        }
        #endregion        

        #region Gets
        public int getDamage()
        {
            return damage;
        }

        public Animation getHitAnim()
        {
            return hitAnimation;
        }
        #endregion

        #region Sets

        public void setHitAnimation(Animation hitAni)
        {
            hitAnimation = hitAni;
        }

        public void kill()
        {
            alive = false;
        }
        #endregion

        #region Update and Draw

        public override void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(getAnimation().GetCurrentImage(), getPosition(), null, Color.White, rotation, origin, 1, SpriteEffects.None, 0f);
        }

        /// <summary>
        /// Função para atualizar a bala, nela a bala morre se passar dos limites da tela e se move pelo espaço
        /// </summary>
        /// <param name="elapsedTime">Tempo decorrido do jogo</param>
        public override void Update(GameTime elapsedTime)
        {
            if(getPosition().Y+getAnimation().GetCurrentImage().Height>gw.ClientBounds.Height ||//checa se a bala saiu por baixo
               getPosition().Y < 0 ||//checa se a bala saiu por cima
               getPosition().X + getAnimation().GetCurrentImage().Width > gw.ClientBounds.Width ||//checa se a bala saiu pela direita
               getPosition().X <0//checa se a bala saiu pela esquerda
               )
            {
                //se a bala saiu da tela ela é destruida
                kill();
            }
            else
                //se a bala não tiver sáido da tela ela se move
                setPosition(getPosition() + getSpeed() * getDirection() * elapsedTime.ElapsedGameTime.Milliseconds);          

        }

        #endregion

        #endregion


    }
}
